#!/bin/bash

# 获取命令行参数
GAME_NAME=$1
APP_NAME=$2

PROCESS_NAME="${GAME_NAME}_${APP_NAME}"
ACTION=${3:-start}  # 默认操作为 restart
IP=${4:-127.0.0.1}            # 第4个参数：IP，默认 127.0.0.1
PORT=${5:-9501}               # 第5个参数：端口，默认 9501
# 检查是否提供了进程名称
if [ -z "$PROCESS_NAME" ]; then
  echo "未提供进程名称！使用方法: $0 <进程名称> [restart|start|stop]"
  exit 1
fi

shutdown_process() {
  local CLIENT_SCRIPT="client.php"
  local IP="${IP:-127.0.0.1}"
  local PORT="${PORT:-9501}"

  # 检查 client.php 是否存在
  if [ ! -f "$CLIENT_SCRIPT" ]; then
    echo "❌ 错误：关闭客户端脚本不存在: $PWD/$CLIENT_SCRIPT"
    exit 1
  fi

  echo "📤 正在发送关闭指令到 $IP:$PORT ..."
  php "$CLIENT_SCRIPT" --h="$IP" --d="$PORT" --a=shutdown

  # 检查是否执行成功（可选）
  if [ $? -ne 0 ]; then
    echo "⚠️  关闭指令发送失败，但仍将继续检查进程状态"
  fi

  echo "⏳ 正在等待 ${PROCESS_NAME} 进程退出..."

  # 循环检查进程是否存在
  while pgrep -f "${PROCESS_NAME}" > /dev/null; do
    echo "🔁 ${PROCESS_NAME} 仍在运行，等待中..."
    sleep 1
  done

  echo "✅ ${PROCESS_NAME} 已成功停止。"
}
# 定义停止进程的函数
stop_process() {
  echo "正在停止所有 ${PROCESS_NAME} 进程..."

  # 使用 PROCESS_NAME 作为关键词匹配进程（更准确）
  PIDS=$(pgrep -f "${PROCESS_NAME}")

  if [ -z "$PIDS" ]; then
    echo "没有找到名为 ${PROCESS_NAME} 的进程。"
    return
  fi

  for PID in $PIDS; do
    echo "正在终止进程 $PID"
    kill -TERM "$PID"
  done

  # 等待停止
  sleep 2

  # 检查是否还有残留
  check_process
}

# 
status_process() {
  PIDS=$(pgrep -f "${PROCESS_NAME}")
  if [ -z "$PIDS" ]; then
    echo "❌ ${PROCESS_NAME} 未运行"
  else
    echo "✅ ${PROCESS_NAME} 正在运行，PID: $PIDS"
    ps -ef | grep "${PROCESS_NAME}" | grep -v grep
  fi
}
check_process() {
  if ! pgrep -f "${PROCESS_NAME}" > /dev/null; then
    echo "✅ 所有 ${PROCESS_NAME} 进程已停止。"
  else
    echo "⚠️  仍有进程在运行，尝试强制终止..."
    for PID in $(pgrep -f "${PROCESS_NAME}"); do
      echo "强制终止 PID: $PID"
      kill -9 "$PID"
    done
  fi
}

# 定义启动进程的函数
start_process() {
  local PHP_FILE="${APP_NAME}.php"
  if [ ! -f "$PHP_FILE" ]; then
    echo "❌ PHP 脚本不存在: $PHP_FILE"
    exit 1
  fi
  php "$PHP_FILE" -h="$IP" -p="$PORT" > /dev/null 2>&1 &
  echo "✅ ${PROCESS_NAME} 已启动，监听 $IP:$PORT"
}

# 定义重启进程的函数
restart_process() {
  stop_process  # 先停止进程
  sleep 1
  start_process # 然后启动进程
  echo "${PROCESS_NAME} 已重启。"
}

# 根据操作类型执行相应动作
case $ACTION in
  status)
    status_process
    ;;
  stop)
    stop_process
    ;;
  start)
    start_process
    ;;
  shutdown)
      shutdown_process
      ;;
  restart)
    restart_process
    ;;
  *)
    echo "未知的操作类型 '$ACTION'！请使用 'restart', 'start', 或 'stop'。status"
    exit 1
    ;;
esac